package eva.savant.business.contabilidad.view

import eva.savant.business.contabilidad.service.TSContabilidad
import eva.savant.businessobject.cg.Cuenta
import eva.savant.businessobject.cg.Preasiento
import eva.savant.businessobject.cg.PreasientoDetalle
import eva.savant.businessobject.gl.Tipo
import eva.savant.core.view.Bean

import javax.faces.bean.ManagedBean
import javax.faces.bean.SessionScoped
import javax.annotation.PostConstruct
import javax.faces.convert.Converter
import org.primefaces.event.SelectEvent

@SessionScoped
@ManagedBean(name = 'IMPreasiento')
public class IMPreasiento extends Bean {

  def lsTipo, debe, haber

  PreasientoDetalle detail

  TSContabilidad tsContabilidad

  @PostConstruct
  public void cleanEntity() {

    tsContabilidad= (TSContabilidad) getSpringBean('tsContabilidad')


    entity= new Preasiento(); init()

    entity.tipo= new Tipo()

    entity.lsPreasientoDetalle= new ArrayList<PreasientoDetalle>()


    lsEntity= new ArrayList<Preasiento>()


    detail= new PreasientoDetalle()

    detail.cuenta= new Cuenta()

    debe = haber = 0


    lsTipo= find(Tipo,'clase.codigo=?','CC')
  }

  public List findLsEntity() {

    return find(Preasiento,'order by id desc')
  }

  public void editEntity(Object id) {

    entity= get(Preasiento, id); detailSum()
  }

  public void detailAdd() {

    if(detail.cuenta?.id == null) {

    if(detail.grupo.equalsIgnoreCase('DEBE'))  detail.cuenta= get(Cuenta.class,'codigo=?','1')

    if(detail.grupo.equalsIgnoreCase('HABER')) detail.cuenta= get(Cuenta.class,'codigo=?','2') }


    def x= new PreasientoDetalle()

    x.cuenta= detail.cuenta

    x.porcentaje= detail.porcentaje

    x.grupo= detail.grupo


    def isNew= true; for(int i=0; i < entity.lsPreasientoDetalle.size(); i++) { def o= entity.lsPreasientoDetalle.get(i)

    if(o.cuenta.id.equalsIgnoreCase(x.cuenta.id)) { entity.lsPreasientoDetalle.set(i,x); isNew= false; break }  }


    if(isNew) entity.lsPreasientoDetalle.add x; detailSum()


    detail= new PreasientoDetalle()

    detail.cuenta= new Cuenta()
  }

  public void detailEdit(SelectEvent event) {

    def x= (PreasientoDetalle) event.object

    detail= new PreasientoDetalle()

    detail.cuenta= x.cuenta

    detail.porcentaje= x.porcentaje

    detail.grupo= x.grupo
  }

  public void detailDelete(PreasientoDetalle x) {

    for(int i=0; i < entity.lsPreasientoDetalle.size(); i++) { def o= entity.lsPreasientoDetalle.get(i)

    if(o.cuenta.id.equalsIgnoreCase(x.cuenta.id)) { entity.lsPreasientoDetalle.remove(i); break }  }

    detailSum()
  }

  public void detailSum() {

    debe = haber = 0; entity.lsPreasientoDetalle.each {

    if(it.grupo.equalsIgnoreCase('DEBE')) debe= debe + it.porcentaje

    if(it.grupo.equalsIgnoreCase('HABER')) haber= haber + it.porcentaje }
  }

  public boolean mergeEntity(Object entity) { alta((Preasiento)entity); entity= (Preasiento) entity

    if(entity.lsPreasientoDetalle?.size() < 1) { addErrorMessage 'El detalle cuentas esta vacio'; return false }

    if(debe != haber) { addErrorMessage 'La suma de porcentajes de los grupos debe y haber no son iguales'; return false }

    return tsContabilidad.mergePreasiento(entity)
  }

  public List complete(String value) { return completeLike(Cuenta,'tipo= 0 and nombre',value) }

  public Converter getConverter() { return converterLike(Cuenta) }

}
